package com.zjff.mobiletwo.service.impl;

import com.zjff.mobiletwo.dao.AddressDao;
import com.zjff.mobiletwo.entity.AddressEntity;
import com.zjff.mobiletwo.entity.ResultEntity;
import com.zjff.mobiletwo.service.IAddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Service
public class AddressServiceImpl implements IAddressService {
    @Autowired
    private AddressDao addressDao;

    @Override
    public String addNewAddress(Integer uid, String username, AddressEntity addressEntity) {
        // 根据参数uid调用addressMapper的countByUid(Integer uid)方法，统计当前用户的收货地址数据的数量
        Integer count = addressDao.countByUid(uid);
        // 判断数量是否达到上限值
        if (count > 20) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"收货地址数量已经达到上限(" + 20 + ")！");
        }
        // 补全数据：将参数uid封装到参数address中
        addressEntity.setUid(uid);
        // 补全数据：根据以上统计的数量，得到正确的isDefault值(是否默认：0-不默认，1-默认)，并封装
        Integer isDefault = count == 0 ? 1 : 0;
        addressEntity.setIsDefault(isDefault);
        // 补全数据：4项日志
        Date now = new Date();
        addressEntity.setCreatedUser(username);
        addressEntity.setCreatedTime(now);
        addressEntity.setModifiedUser(username);
        addressEntity.setModifiedTime(now);

        // 调用addressMapper的insert(Address address)方法插入收货地址数据，并获取返回的受影响行数
        Integer rows = addressDao.insert(addressEntity);
        // 判断受影响行数是否不为1
        if (rows != 1) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"插入收货地址数据时出现未知错误，请联系系统管理员！");
        }
        return ResultEntity.Success(null,addressDao.findByUid(uid),0,"添加成功!");
    }

    @Override
    public String getByUid(Integer uid) {
        List<AddressEntity> list = addressDao.findByUid(uid);
        for (AddressEntity address : list) {
            address.setUid(null);
            address.setProvinceCode(null);
            address.setCityCode(null);
            address.setAreaCode(null);
            address.setCreatedUser(null);
            address.setCreatedTime(null);
            address.setModifiedUser(null);
            address.setModifiedTime(null);
        }
        return ResultEntity.Success(null,list,0,"查询成功!");
    }
    @Transactional
    @Override
    public String setDefault(Integer aid, Integer uid, String username) {
        // 根据参数aid，调用addressMapper中的findByAid()查询收货地址数据
        AddressEntity result = addressDao.findByAid(aid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"尝试访问的收货地址数据不存在！");
        }
        // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
        if (!result.getUid().equals(uid)) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"与当前登入的用户不一致非法访问！！！");
        }
        // 调用addressMapper的updateNonDefaultByUid()将该用户的所有收货地址全部设置为非默认，并获取返回受影响的行数
        Integer rows = addressDao.updateNonDefaultByUid(uid);
        // 判断受影响的行数是否小于1(不大于0)
        if (rows < 1) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"设置默认收货地址时出现未知错误[1]");
        }
        // 调用addressMapper的updateDefaultByAid()将指定aid的收货地址设置为默认，并获取返回的受影响的行数
        rows = addressDao.updateDefaultByAid(aid, username, new Date());
        // 判断受影响的行数是否不为1
        if (rows != 1) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"设置默认收货地址时出现未知错误[2]");
        }
        return ResultEntity.Success(null,addressDao.findByAid(aid),0,"设置默认收货地址成功!");
    }
    @Transactional
    @Override
    public String delete(Integer aid, Integer uid, String username) {
        // 根据参数aid，调用findByAid()查询收货地址数据
        AddressEntity result = addressDao.findByAid(aid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"尝试访问的收货地址数据不存在！");
        }
        // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
        if (!result.getUid().equals(uid)) {;
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"与当前登入的用户不一致非法访问！！！");
        }
        // 根据参数aid，调用deleteByAid()执行删除
        Integer rows1 = addressDao.deleteByAid(aid);
        if (rows1 != 1) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"删除收货地址数据时出现未知错误，请联系系统管理员");
        }
        // 判断查询结果中的isDefault是否为0
        if (result.getIsDefault() == 0) {
            return ResultEntity.Success(null,1,0,"删除成功（此为非默认地址）!");
        }
        // 调用持久层的countByUid()统计目前还有多少收货地址
        Integer count = addressDao.countByUid(uid);
        // 判断目前的收货地址的数量是否为0
        if (count == 0) {
            // 是：抛出异常
            return ResultEntity.Success(null,1,0,"删除成功（目前的收货地址的数量为0）!");
        }
        // 调用findLastModified()找出用户最近修改的收货地址数据
        AddressEntity lastModified = addressDao.findLastModified(uid);
        // 从以上查询结果中找出aid属性值
        Integer lastModifiedAid = lastModified.getAid();
        // 调用持久层的updateDefaultByAid()方法执行设置默认收货地址，并获取返回的受影响的行数
        Integer rows2 = addressDao.updateDefaultByAid(lastModifiedAid, username, new Date());
        // 判断受影响的行数是否不为1
        if (rows2 != 1) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"更新收货地址数据时出现未知错误，请联系系统管理员");
        }
        return ResultEntity.Success(null,1,0,"删除成功(将最新修改的地址命名为默认地址)!");
    }

    @Override
    public AddressEntity getByAid(Integer aid, Integer uid) {
        AddressEntity addressEntity = addressDao.findByAid(aid);
        // 判断查询结果是否为null
        if (addressEntity == null){
            return null;
        }
        // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
        if (!addressEntity.getUid().equals(uid)) {;
            // 是：抛出异常
            return null;
        }
        addressEntity.setProvinceCode(null);
        addressEntity.setCityCode(null);
        addressEntity.setAreaCode(null);
        addressEntity.setCreatedUser(null);
        addressEntity.setCreatedTime(null);
        addressEntity.setModifiedUser(null);
        addressEntity.setModifiedTime(null);
        return addressEntity;
    }

    @Override
    public String updateByAid(Integer aid,Integer uid,String username,String name,String provinceName,String provinceCode,
                              String cityName,String cityCode,String areaName,String areaCode,String zip,
                              String address,String phone,String tag,Integer isDefault) {
        // 根据参数aid，调用findByAid()查询收货地址数据
        AddressEntity result = addressDao.findByAid(aid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"尝试访问的收货地址数据不存在！");
        }
        // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
        if (!result.getUid().equals(uid)) {;
            // 是：抛出异常
            return ResultEntity.Fail(-10007,"与当前登入的用户不一致非法访问！！！");
        }
        // 补全数据：4项日志
        Date now = new Date();
        int rowCount= addressDao.updateByAid(
                aid,name,provinceName,provinceCode,cityName,cityCode,areaName,areaCode,
                zip,address,phone,tag,isDefault,username,now);
        if (rowCount != 1) {
            return ResultEntity.Fail(-10007,"修改商品数量时出现未知错误，请联系系统管理员!");
        }
        return ResultEntity.Success(null,addressDao.findByAid(aid),0,"修改成功!");
    }
}
